package pe.reproduccion;

import java.util.ArrayList;

import pe.algenetico.MiRandom;
import pe.cromosoma.Cromosoma;

public class OXVariante_OrdenPrioritario extends Cruce{

	public Cromosoma[] cruce(Cromosoma padre1, Cromosoma padre2, MiRandom ran, int param){
			
		ArrayList<Integer> valorPuntos1 = new ArrayList<Integer>();
		ArrayList<Integer> valorPuntos2 = new ArrayList<Integer>();
		
		int[] puntos = new int[param];
		for(int i=0; i<param; i++){
			puntos[i] = ran.r.nextInt(padre1.getLong_cromo());
			for(int j=0; j<i; j++) if (puntos[i] == puntos[j]) i--;
		}
		
		puntos = ordenarPuntos(puntos);
		
		for(int i=0; i<param; i++){
			int aux= puntos[i];
			valorPuntos1.add(i,padre1.getIndices()[aux]);
			valorPuntos2.add(i,padre2.getIndices()[aux]);
		}
		
		int[] hijo1 = new int[padre1.getLong_cromo()];
		int[] hijo2 = new int[padre1.getLong_cromo()];
		
		for(int i=0; i<padre1.getLong_cromo();i++){
			if(valorPuntos1.contains(padre2.getIndices()[i])) hijo1[i] = -1;
			else hijo1[i] = padre2.getIndices()[i];
			
			if(valorPuntos2.contains(padre1.getIndices()[i])) hijo2[i] = -1;
			else hijo2[i] = padre1.getIndices()[i];
			
		}
		
		int j1=0;
		int j2=0;
		for(int i=0; i<padre1.getLong_cromo();i++){
			if(hijo1[i] == -1) {
				hijo1[i] = valorPuntos1.get(j1);
				j1++;
				}
			if(hijo2[i] == -1) {
				hijo2[i] = valorPuntos2.get(j2);
				j2++;
				}		
		}
		
		
		padre1.setIndices(hijo1);
		padre2.setIndices(hijo2);
		
		padre1.setAptitud(padre1.evalua());
		padre2.setAptitud(padre2.evalua());
		
		Cromosoma[] resultado = new Cromosoma[2];
		resultado[0]=padre1;
		resultado[1]=padre2;
		
		return resultado;
	}
	
	private int[] ordenarPuntos(int[] pob){
		int temp=0;
		for (int i=1; i<pob.length; i++)
			for (int j=0 ; j<pob.length - 1; j++)
			if (pob[j] > pob[j+1]){
				temp = pob[j];
				pob[j] = pob[j+1];
				pob[j+1] = temp;
			}
		return pob;
	}
	
	
}
